﻿// 601 数位和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory.h>

using namespace std;
/*
http://oj.daimayuan.top/course/5/problem/245
读入 l,r，请求出 0...9 这些数字在 [l,r]的数位中分别出现了多少次。

输入格式
一行两个整数 l,r。

输出格式
一行 10 个数字，第 i个数字表示 i−1在 [l,r]的数位中出现的次数。

样例输入
1 100
样例输出
11 21 20 20 20 20 20 20 20 20
数据范围
对于 100%
 的数据，保证 1≤l≤r≤1016。
*/
int c[21];
long long  l, r, ans[10], f[17];


void calc(long long n, int xs) {
	int m = 0;
	for (; n; n /= 10)
		c[++m] = n % 10;
	for (int i = 1, j = m; i < j; i++, j--) {
		swap(c[i], c[j]);
	}
	for (int i = 1; i <= m; i++) {
		// 12345 当前索引i=3 c[i] =3
		// 当前位可以填写 0 1 2 ,  对于i之前的数字贡献是 3*10^(2)
		for (int j = 1; j < i; j++) {
			ans[c[j]] += xs * c[i] * f[m - i];
		}

		//当前位 填写1~c[i]-1  的贡献  1~2 * 10^(5-3)
		for (int j = 1; j < c[i]; j++) {
			ans[j] += xs * f[m - i];
		}

		//当前位 0 的贡献  不是第一位 且c[i] 不为0 
		if (i != 1 && c[i])
			ans[0] += xs * f[m - i];
		
		//i 之后的贡献  1到9   有m-i的坑 每个坑可以出现 10(^m-i-1)次 因为有个坑固定填写1到9的位置了
		//不是第一位 可以考虑0的贡献
		if (m != i) {
			for (int j = 1; j < 10; j++)
				ans[j] += xs * f[m - i - 1] * (m - i) * c[i];
			if (i != 1)
				ans[0] += xs * f[m - i - 1] * (m - i) * c[i];
		}

		//遍历非0的起始位
		if (i == 1) {
			if (m >= 2)
				ans[0] += xs * (c[1] - 1) * (m - 1) * f[m - 2];
			for (int j = 2; j < m; j++)
				ans[0] += xs * 9 * (m - j) * f[m - j - 1];
		}
	}

	for (int i = 1; i <= m; i++)
		ans[c[i]] += xs;
}


int main()
{
	f[0] = 1;
	for (int i = 1; i <= 16; i++)
		f[i] = f[i - 1] * 10;
	while(scanf("%lld%lld", &l, &r)){
	    if(l==0&&r==0) break;
	if(l>r) swap(l,r);
	memset(ans,0,sizeof ans);
	calc(r, 1);
	calc(l - 1, -1);
	for (int i = 0; i < 10; i++) {
		printf("%lld ", ans[i]);
	}
	printf("\n");
	}

	return 0;
}

/*
//y总模板
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 10;

int get(vector<int> num, int l, int r)
{
	int res = 0;
	for (int i = l; i >= r; i--) res = res * 10 + num[i];
	return res;
}

int power10(int x)
{
	int res = 1;
	while (x--) res *= 10;
	return res;
}

int count(int n, int x)
{
	if (!n) return 0;        

	vector<int> num;
	while (n)
	{
		num.push_back(n % 10);
		n /= 10;
	}
	n = num.size();

	int res = 0;
	for (int i = n - 1 - !x; i >= 0; i--)
	{
		if (i < n - 1)
		{
			res += get(num, n - 1, i + 1) * power10(i);
			if (!x) res -= power10(i);
		}

		if (num[i] == x) res += get(num, i - 1, 0) + 1;
		else if (num[i] > x) res += power10(i);
	}

	return res;
}

int main()
{
	int a, b;
	while (cin >> a >> b, a)
	{
		if (a > b) swap(a, b);

		for (int i = 0; i <= 9; i++)
			cout << count(b, i) - count(a - 1, i) << ' ';
		cout << endl;
	}

	return 0;
}

*/
